<?php

namespace app\admin\model\scanwork;

use think\Model;

/**
 * BOM明细模型
 */
class BomItem extends Model
{
    // 表名
    protected $name = 'scanwork_bom_item';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    
    // 追加属性
    protected $append = [
        'is_key_material_text',
        'is_optional_text'
    ];

    /**
     * 是否关键物料文本
     */
    public function getIsKeyMaterialTextAttr($value, $data)
    {
        return isset($data['is_key_material']) && $data['is_key_material'] ? '是' : '否';
    }

    /**
     * 是否可选件文本
     */
    public function getIsOptionalTextAttr($value, $data)
    {
        return isset($data['is_optional']) && $data['is_optional'] ? '是' : '否';
    }

    /**
     * 关联BOM主表
     */
    public function bom()
    {
        return $this->belongsTo('Bom', 'bom_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }

    /**
     * 关联物料
     */
    public function material()
    {
        return $this->belongsTo('Material', 'material_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }

    /**
     * 关联供应商
     */
    public function supplier()
    {
        return $this->belongsTo('Supplier', 'supplier_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }

    /**
     * 关联父级
     */
    public function parent()
    {
        return $this->belongsTo('BomItem', 'parent_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }

    /**
     * 关联子级
     */
    public function children()
    {
        return $this->hasMany('BomItem', 'parent_id', 'id');
    }

    /**
     * 关联替代料
     */
    public function substitutes()
    {
        return $this->hasMany('BomSubstitute', 'bom_item_id', 'id');
    }

    /**
     * 计算实际用量（含损耗）
     */
    public function calculateActualQuantity()
    {
        $lossRate = $this->loss_rate ?: 0;
        $quantity = $this->quantity ?: 0;
        
        $this->actual_quantity = $quantity * (1 + $lossRate / 100);
        return $this->actual_quantity;
    }

    /**
     * 计算总价
     */
    public function calculateTotalPrice()
    {
        $actualQuantity = $this->actual_quantity ?: $this->calculateActualQuantity();
        $unitPrice = $this->unit_price ?: 0;
        
        $this->total_price = $actualQuantity * $unitPrice;
        return $this->total_price;
    }

    /**
     * 自动计算并保存
     */
    public function autoCalculate()
    {
        $this->calculateActualQuantity();
        $this->calculateTotalPrice();
        $this->save();
    }
}

